﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using BusinessLogic.Security;
using System.Threading;
using System.Security.Principal;

namespace Otgruzka
{
    public class Global : System.Web.HttpApplication
    {

        void Application_Start(object sender, EventArgs e)
        {
            // Code that runs on application startup

        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {
        }

        protected void Application_BeginRequest(Object sender, EventArgs e)
        {
        }

        protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated && !String.IsNullOrEmpty(HttpContext.Current.User.Identity.Name))
            {
                FormsIdentity fIdent = HttpContext.Current.User.Identity as FormsIdentity;

                // Create a CustomIdentity based on the FormsAuthenticationTicket           
                CustomIdentity ci = new CustomIdentity(fIdent.Ticket);

                // Create the UserPrincipal
                UserPrincipal p = new UserPrincipal(ci);

                // Attach the UserPrincipal to HttpContext.User and Thread.CurrentPrincipal
                HttpContext.Current.User = p;
                Thread.CurrentPrincipal = p;

                HttpContext.Current.User = BusinessLogic.Security.AuthenticationService.AuthorizeUser(ci.LoginName, ci.PassdwordHash, ci);
            }
            

            #region Проверка на разрешение показа загружаемой страницы текущему пользователю

            var user = HttpContext.Current.User as BusinessLogic.Security.UserPrincipal;
            if (user != null)
            {
                string localPath = HttpContext.Current.Request.Url.LocalPath;
                //new Common.Logger().LogMessage("Проверка на разрешение показа загружаемой страницы текущему пользователю: " + localPath);

                // Если уже произвеедн переход на страницу AccessDenied, то останавливается работа. А то может получиться зацикливание
                //if (localPath.ToLower() == ("~/WebForms/Errors/AccessDenied.aspx").ToLower() || localPath == ("~/WebForms/Errors/PageNotFound.aspx").ToLower())
                if (localPath.ToLower().Contains(("AccessDenied.aspx").ToLower()) || localPath.ToLower().Contains(("PageNotFound.aspx").ToLower()))
                    return;

                if (localPath.Contains(".aspx") ||
                    localPath.Contains(".ascx") ||
                    localPath.Contains(".ashx")) // Если обрабатывается загрузка страницы
                {
                    // Пропускаем страницу по-умолчанию или страницу логина
                    if (localPath.ToLower().Contains(("Default.aspx").ToLower()) || localPath.ToLower().Contains(("Login.aspx").ToLower()))
                        return;
                    // Пропускаем свободнодоступные хэндлеры
                    if (localPath.ToLower().Contains(("ExcelReport.ashx").ToLower()))
                        return;

                    if (user.WebPageItems == null || user.WebPageItems.Count == 0)
                    {
                        // Редирект на страницу Access Denied
                        Response.Redirect("~/WebForms/Errors/AccessDenied.aspx");
                    }

                    var accessPages =
                        user.WebPageItems.Where(p =>
                            localPath.ToLower().Contains(string.IsNullOrEmpty(p.Name) ? "   " : p.Name.ToLower()) ||
                            localPath.ToLower().Contains(string.IsNullOrEmpty(p.Url) ? "   " : p.Url.ToLower()));
                    if (accessPages == null || accessPages.Count() == 0) // Страницы нет в списке разрешенных
                    {
                        // Редирект на страницу Access Denied
                        Response.Redirect("~/WebForms/Errors/AccessDenied.aspx");
                    }
                }
            }
            #endregion Проверка на разрешение показа загружаемой страницы текущему пользователю
        }        

        void Application_End(object sender, EventArgs e)
        {
            //  Code that runs on application shutdown

        }

        void Application_Error(object sender, EventArgs e)
        {
            new Common.Logger().LogException(HttpContext.Current.Error);
            //var logger = NLog.LogManager.GetCurrentClassLogger();
            //logger.ErrorException("====Application_Error:====", HttpContext.Current.Error);

            Exception exception = HttpContext.Current.Error;
            //HttpContext.Current.ClearError();

            ////404 error
            //if (exception is HttpException)
            //{
            //    var httpExc = (HttpException)exception;
            //    if (httpExc.GetHttpCode() == 404)
            //    {
            //        Response.Redirect("~/WebForms/Errors/PageNotFound.aspx", true);
            //        return;
            //    }
            //}
        }


        //void Session_Start(object sender, EventArgs e)
        //{
        //    // Code that runs when a new session is started
        //    Session.Timeout = 600;
        //}

        //void Session_End(object sender, EventArgs e)
        //{
        //    // Code that runs when a session ends. 
        //    // Note: The Session_End event is raised only when the sessionstate mode
        //    // is set to InProc in the Web.config file. If session mode is set to StateServer 
        //    // or SQLServer, the event is not raised.

        //}

    }
}
